home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / self / contrib.lha / contrib / xlib-support / primitiveMaker.self next >
Text File  |  1993-05-18  |  38KB  |  1,284 lines

  1. "Sun-$Revision: 8.2 $"
  2.  
  3. "Copyright 1992 Sun Microsystems, Inc. and Stanford University.
  4.  See the LICENSE file for license information."
  5.  
  6. "CAUTION: This file is not part of the documented Self world.  It may be
  7.  be changed or removed at any time, and it will not be documented.  Don't
  8.  try to learn good Self style from this file.
  9.  
  10.  This file can be removed from all.self without affecting the Self world,
  11.  except for tests.wrappers.self which uses it for testing purposes."
  12.  
  13. "
  14.     This program is an attempt to make it easier to add primitives to Self.
  15.     It reads primitive templates and creates the self glue code, the
  16.     primitive table entries, and the C++ headers, glue functions, and glue
  17.     macros.
  18.  
  19.     To read primitive templates construct a file whose name ends with
  20.     ``.self''.
  21.     The file should have the following format:
  22.  
  23.         primitiveMaker  reader copy [staticLinking|dynamicLinking] 
  24.       create: 'fileNamePrefix' From: '
  25.  
  26.         template1
  27.         template2
  28.         template3a \
  29.         template3b
  30.         ...
  31.         templateN
  32.         '
  33.  
  34.     Then use the _RunScript primitive from the shell to execute your file.
  35.     This program will write out two files:
  36.         fileNamePrefix.{wrappers.self,primMaker.h}.
  37.  
  38.     Blank lines are ignored.
  39.     Any line starting with ``//'' is ignored.
  40.     Any line starting with ``--'' is inserted as a comment in the output files.
  41.  
  42.     A template is a sequence of nonwhite tokens, or anything inside of
  43.       curly brackets.
  44.  
  45.     Three special templates specify supplemental information:
  46.          traits: <self-path>
  47.       
  48.               specifies the self traits object that will be the target of
  49.               the _AddSlots for the wrappers.
  50.  
  51.          macroName: <macro-name>
  52.  
  53.               specifies the base name of the macro that will be defined to
  54.               hold all the lines of glue or primitive entries
  55.               (macro-name_glue or macro-name_entries)
  56.  
  57.      glueLibaryName: <glue-library-name>
  58.  
  59.           (This template applies only to dynamic linking.)
  60.           specifies the file name of the glue library.
  61.         
  62.     The syntax of the other templates is:
  63.     [_|^] <wrapper-spec> = <resultType> <type-of-prim> <c-name> <primTableInfo>
  64.  
  65.     <wrapper-spec> gives the name of the Self-wrapper, and the argument
  66.         type conversion specs. It is a sequence of keywords, interspersed with 
  67.         type conversion specs. The first spec may be void to force the
  68.         wrapper to discard the receiver.
  69.  
  70.     Type conversion specs:
  71.       This package knows about the following type conversions:
  72.  
  73.            oop            any_oop           smi
  74.            void              any
  75.        bool
  76.  
  77.        float          double        long_double
  78.  
  79.        char              signed_char        unsigned_char
  80.        short      signed_short        unsigned_short
  81.        int          signed_int        unsigned_int      int_or_errno
  82.        long          signed_long        unsigned_long
  83.  
  84.            string         string_len        string_null       string_len_null
  85.  
  86.         *  bv             bv_len            bv_null           bv_len_null
  87.         *  cbv            cbv_len           cbv_null          cbv_len_null
  88.  
  89.         +  proxy          proxy_null        proxy_or_errno
  90.         +  fct_proxy      fct_proxy_null
  91.  
  92.         +  aClassName
  93.  
  94.      * byteVectors require a pointer type, e.g., <bv_len char*>
  95.        
  96.      + Using <aClassName> specifies a pointer to the class or structure.
  97.        So does <proxy aClassName* sealName>.
  98.        Using <proxy aClassName sealName> specifies the class or structure.
  99.  
  100.     <resultType> is the type conversion for the primitive result.
  101.  
  102.     <type-of-prim> = get[Member] | set[Member] | call[Member] | new | delete.
  103.  
  104.     <cname> is the name of the C function or varaible. Omitted for new, delete.
  105.  
  106.     <primTableInfo> = [canAWS] [cannotFail] [passFailHandle]
  107.       The next token may be cannotFail, if the C primitive cannotFail.
  108.       Or it may be canAWS, if the C primitive can abort, walk the stack or
  109.         scavenge.
  110.       Or it may be passFailHandle to pass a failure handle as the last
  111.         argument.
  112.  
  113.  
  114.     To test this out, type ``primitiveMaker reader copy staticLinking test''.
  115. "
  116.  
  117. traits     applications _AddSlotsIfAbsent: (| primitiveMaker = () |)
  118. prototypes applications _AddSlotsIfAbsent: (| primitiveMaker = () |)
  119.  
  120.  
  121. traits primitiveMaker _AddSlotsIfAbsent: ( |
  122.            abstractLinking = ().
  123.          staticLinking = ().
  124.         dynamicLinking = ().
  125.  
  126.                     reader = ().
  127.                 parser = ().
  128.                       cvts = ().
  129.               msg  = ().
  130.             typeTraits = ().
  131. | )
  132.  
  133. prototypes  primitiveMaker _AddSlotsIfAbsent: ( | 
  134.              generator = ().
  135.                     reader = ().
  136.                 parser = ().
  137.                       cvts = ().
  138.               msg  = ().
  139. | )
  140.  
  141.  
  142. traits     primitiveMaker abstractLinking _AddSlotsIfAbsent: ( |
  143.    generator = ().
  144. | )
  145.  
  146. traits     primitiveMaker staticLinking _AddSlotsIfAbsent: ( |
  147.    generator = ().
  148. | )
  149.  
  150. traits     primitiveMaker dynamicLinking _AddSlotsIfAbsent: ( |
  151.    generator = ().
  152. | )
  153.  
  154.  
  155. traits primitiveMaker reader  _Define: ( |
  156.   _ parent* = traits clonable.
  157.   _ ignoredCommentPrefix  = '//'.
  158.   _ includedCommentPrefix = '--'.
  159.  
  160.   ^ create: filePrefix From: inputString = (
  161.         create: filePrefix From: inputString Writing: true ).
  162.  
  163.   ^ create: filePrefix From: in Writing: doWrite = (
  164.         setupFileHeaders.
  165.         read: in.
  166.         doWrite ifTrue: [ write: filePrefix ].
  167.         self).
  168.  
  169.   _ write: prefix = (
  170.         " convert to strings so each character isn't output individually "
  171.         " (eliminate when printOnFile: uses buffered files) "
  172.  
  173.         wrappers asString printOnFile: 
  174.             (unix environmentVariable: 'SELF_WORKING_DIR'), '/',
  175.             selfDirectory, '/', prefix, '.wrappers.self'.
  176.  
  177.         (entries, '\n\n', glue) asString printOnFile: 
  178.         (unix environmentVariable: 'SELF_WORKING_DIR'), '/',
  179.         cDirectory, '/', prefix, '.primMaker.h'.
  180.         self).
  181.  
  182.  
  183.    _ read: in = ( | inList. token. line. r. |
  184.         inList: list copyRemoveAll.
  185.         r:      list copyRemoveAll.
  186.  
  187.         in: in  WithoutEscNLDo: [|:c| inList addLast: c].
  188.  
  189.         line:   list copyRemoveAll.
  190.     [|:exit|
  191.         [ 
  192.         inList isEmpty  ||  ['\n' = inList first]   ifTrue: [
  193.             processTemplate: line.
  194.             inList isEmpty ifTrue: exit.    
  195.             line: list copyRemoveAll.        
  196.         ].
  197.         '\t \n' includes: inList first
  198.             ] whileTrue: [inList removeFirst].
  199.         
  200.         token: list copyRemoveAll.
  201.         inList first = '{' ifTrue: [
  202.             inList removeFirst.
  203.         [|:exitBracketToken. c |
  204.             inList isEmpty ifTrue: [^error: 'open { but no closing }'].
  205.             c: inList removeFirst.
  206.             c = '}' ifTrue: exitBracketToken.
  207.             token addLast: c.
  208.         ] loopExit.
  209.         ] False: [
  210.             [|:exitToken. |
  211.             inList isEmpty  ifTrue: exitToken.
  212.             ('\t \n' includes: inList first)  ifTrue: exitToken.
  213.             token addLast: inList removeFirst.
  214.         ] loopExit.
  215.         ].
  216.         line addLast: token asString.
  217.     ] loopExit.
  218.  
  219.         processEnd).
  220.                 
  221.  
  222.   _ in: in WithoutEscNLDo: b = ( | lastWasBackslash <- false |
  223.         in do: [|:c|
  224.             lastWasBackslash ifFalse: [b value: c] True: [
  225.                 '\n' = c ifFalse: [
  226.                     b value: '\n' first.
  227.                     b value: c.
  228.                 ].
  229.             ].
  230.             lastWasBackslash: '\\' = c
  231.         ].
  232.         b value: '\n' first. "needed for tokenize"
  233.         self).
  234.  
  235.  
  236.   _ setupFileHeaders = (
  237.         | warning = 'This information was generated by the primitive maker',
  238.                     ' (primitiveMaker.self).\nPlease do not change it',
  239.                     ' manually. -- dmu 12/91 '.
  240.           pragma = '# pragma interface\n\n'.
  241.         |
  242.         comment: warning.
  243.     appendToMacros: pragma).
  244.  
  245.   _ appendToMacros: s = (entries: entries, s.   glue: glue, s).
  246.  
  247.   _ comment: c = (
  248.       wrappers: wrappers, sComment: c.
  249.       appendToMacros: cComment: c).
  250.  
  251.  
  252.   _ sComment: c = ('" ' , c, ' "\n\n' ).
  253.   _ cComment: c = ('/* ', c, ' */\\\n\\\n').
  254.  
  255.   _ processTemplate: line = ( | p. g |
  256.     feedback: 'processing ', (line printStringSize: infinity).
  257.         line isEmpty                       ifTrue: [^self].
  258.         line first = ignoredCommentPrefix  ifTrue: [^self].
  259.         line first = includedCommentPrefix ifTrue: [| s <- ''. |
  260.         line doFirst: [] MiddleLast: [|:t| s: s, t, ' '] IfEmpty: []. 
  261.             ^ comment: s.
  262.         ].
  263.         line first = 'traits:'         ifTrue: [^processTraits:          line].
  264.         line first = 'macroName:'        ifTrue: [^processMacroName:       line].
  265.     line first = 'glueLibraryName:'     ifTrue: [^processGlueLibraryName: line].
  266.     p: primitiveMaker parser copy.
  267.     p tokenList: line.
  268.     p parse.
  269.  
  270.         g: primitiveMaker generator copy.
  271.     g reader: self.
  272.     g parser: p.
  273.     g generate.
  274.  
  275.         appendFrom: g.
  276.         self).
  277.  
  278.   ^ appendFrom: gen = (
  279.         wrappers: wrappers, gen wrapper.
  280.     glue:     glue,     gen glue.
  281.     entries:  entries,  gen entry).
  282.  
  283.  
  284.   _ processTraits: line = (
  285.       line removeFirst.
  286.       endOfWrappers.
  287.       line do: [|:tok| wrappers: wrappers, tok, ' '].
  288.       wrappers: wrappers, '_AddSlots: ( |\n\n'.
  289.       isInAddSlots: true).
  290.  
  291.   _ processMacroName: line = (
  292.       line removeFirst.
  293.       endOfMacros.
  294.       macroName: line first.
  295.       line removeFirst.
  296.       isInDefine: true).
  297.  
  298.   _ macroName: n = (
  299.       glue:    glue,    '# define ', n, '_glue    \\\n\\\n'.
  300.       entries: entries, '# define ', n, '_entries \\\n\\\n').
  301.  
  302.   _ processEnd = (endOfWrappers).
  303.  
  304.   _ endOfWrappers = (
  305.       isInAddSlots ifTrue: [wrappers: wrappers, '| )\n\n'.  isInAddSlots: false].
  306.       self).
  307.  
  308.   _ endOfMacros     = (
  309.       isInDefine   ifTrue: [appendToMacros: '\n\n'.  isInDefine:   false].
  310.       self).
  311.  
  312.   ^ test = ( test: true ).
  313.  
  314.   ^ test: doWrite = ( | reader |
  315.         reader: copy.
  316.     reader staticLinking.
  317.         reader cDirectory: ''.
  318.         reader create: 'test' From: '
  319.  
  320.         // a comment that is ignored
  321.         -- a comment that is included in the output
  322.  
  323.         traits:    fribble frabble
  324.         macroName: smortlehoffer
  325.  
  326.         void copy_color: color Shape: shape = Inode {inodeProto deadCopy} new
  327.  
  328.         _ Inode delete = void delete
  329.  
  330.         ^ void errorNumber      = int get errno
  331.         void errorNumber: int = void set errno
  332.  
  333.     Pixrect pr_zap      = frob frobToSideEffect getMember bark
  334.     Pixrect pr_zap: int = frob frobToSideEffect setMember bark
  335.     Pixrect pr_zap: int = frob {frob xroto} callMember bark
  336.  
  337.  
  338.         void time = int call ftime
  339.  
  340.         ^ void open: string Mode: int = int call open
  341.         ^ void open: string \
  342.            Mode: int = proxy int int_seal pToSideEffect call open
  343.  
  344.         _ void exit: int     = void call exit canAWS cannotFail
  345.         _ void exit: any_oop = void call exit canAWS cannotFail passFailHandle
  346.  
  347.         ' Writing: doWrite.
  348.         self).
  349.  
  350.     _ noisy = ( | _ feedback: string = ( string printLine.   self ). | ).
  351.     _ quiet = ( | _ feedback: string = (             self ). | ).
  352.  
  353.     _ feedingBack* <- ().
  354.  
  355.     ^ beNoisy = (feedingBack: noisy).
  356.     ^ beQuiet = (feedingBack: quiet).
  357.  
  358.     ^ staticLinking = (
  359.           generatorTraits:  traits primitiveMaker staticLinking generator.
  360.       cDirectory:       'prims').
  361.  
  362.     ^ dynamicLinking = (
  363.           generatorTraits:  traits primitiveMaker dynamicLinking generator.
  364.       cDirectory:        'self').
  365.  
  366.   _ processGlueLibraryName: line = (
  367.         line removeFirst.
  368.     glueLibraryName: line first).
  369.  
  370.  
  371.   _ glueLibraryName: n = ( glueLibraryNameSlot: '\'', n, '\'' ).
  372.  
  373.   _ noGlueLibraryName = 'user must specify me'.
  374.   
  375.   _ initializeGlueLibraryName = (glueLibraryNameSlot: noGlueLibraryName).
  376.  
  377.   ^ glueLibraryName = (
  378.         glueLibraryNameSlot = noGlueLibraryName
  379.       ifFalse: [glueLibraryNameSlot] 
  380.          True: [
  381.         error: 
  382.           'You must include a \"glueLibraryName:\" template',
  383.               '  for dyanamic linking. ',
  384.           'The library name gives the name of the .so file containing the',
  385.           ' glue.'
  386.         ]).
  387. | ) beNoisy
  388.  
  389.  
  390. primitiveMaker reader _Define: ( |
  391.     _ parent* = traits primitiveMaker reader.
  392.  
  393.     _ selfDirectory <- 'self'.
  394.     _ cDirectory    <- 'self'.
  395.  
  396.     ^ wrappers <- ''.
  397.     ^ entries  <- ''.
  398.     ^ glue     <- ''.
  399.  
  400.     ^ isInAddSlots <- false.
  401.     ^ isInDefine   <- false.
  402.  
  403.     ^_ generatorTraits <- ().
  404.      _ glueLibraryNameSlot  <- ''.
  405. | )
  406.  
  407.  
  408. "==============================================="
  409. traits primitiveMaker parser _Define: ( |
  410.   _ parent** = traits clonable.
  411.  
  412.   ^ copy = ((
  413.         resend.copy   keywords:           keywords         copyRemoveAll)
  414.                       argCvts:            argCvts          copyRemoveAll).
  415.  
  416.   ^ parse = (
  417.         ('_^' includes: tokenList first first) ifTrue: [
  418.         privacy: tokenList removeFirst.
  419.     ].
  420.         [|:exit|
  421.             argCvts addLast: selectCvt parseArgFrom: tokenList.
  422.             tokenList first = '='  ifTrue: exit.
  423.             keywords addLast: tokenList removeFirst.
  424.             tokenList first = '='  ifTrue: exit.
  425.         ] loopExit.
  426.         tokenList removeFirst. "rm = "
  427.  
  428.         resultCvt:  selectCvt parseResFrom: tokenList.
  429.         primType:   tokenList removeFirst.
  430.         cName:   (primType = 'new'   ) ifTrue: 'new'     False: [
  431.              (primType = 'delete') ifTrue: 'delete'  False: [
  432.          tokenList removeFirst]].
  433.         
  434.         [tokenList isEmpty] whileFalse: [
  435.             tokenList removeFirst, ':' sendTo: self With: true.
  436.         ].
  437.         self).
  438.  
  439.   _ selectCvt = ( | c <- '' |
  440.     c: tokenList removeFirst.
  441.     '_' = c  ifTrue: [primitiveMaker cvts proxyForClass: c]
  442.                   False: [c sendTo: primitiveMaker cvts]).
  443. | )
  444.  
  445. primitiveMaker parser _Define: ( |
  446.   _ parent* = traits primitiveMaker parser.
  447.  
  448.   _^ tokenList <- list.
  449.   ^_ privacy  <- ''.
  450.   ^_ keywords  <- list.
  451.   ^_ argCvts   <- list.
  452.   ^_ resultCvt <- ().
  453.   ^_ primType <- 'call'.
  454.   ^_ cName    <- 'open'.
  455.  
  456.     " sendTo's"
  457.  
  458.   ^ canAWS         <- false.
  459.   ^ cannotFail     <- false.
  460.   ^ passFailHandle <- false.
  461. | )
  462.  
  463.  
  464. "========================================================"
  465. traits primitiveMaker abstractLinking generator _Define: ( |
  466.   _ parent* = traits clonable.
  467.  
  468.   ^ generate = (
  469.     typeParent: parser primType sendTo: traits primitiveMaker typeTraits.
  470.     generatorParent: reader generatorTraits.
  471.     gen).
  472.  
  473.  
  474.   _ cName     = (parser cName).
  475.   _ argCvts   = (parser argCvts).
  476.   _ resultCvt = (parser resultCvt).
  477.   _ className = (argCvts first className).
  478.                 
  479.   _ gluePrefix = (
  480.              cName = ''         ifTrue: [className            ] False: [
  481.      className = ''         ifTrue: [    cName            ] False: [
  482.              cName = className  ifTrue: [    cName            ] False: [
  483.                                          className, '_', cName]]]).
  484.   _ gen = (
  485.         "ordering is essential"
  486.     buildGlueName.
  487.         buildWrapper.
  488.         self).
  489.  
  490.  
  491.   _ buildGlueName = (
  492.     glueName: gluePrefix.
  493.     glueName isEmpty ifFalse: [glueName: glueName, '_'].
  494.     parser keywords do: [|:k| 
  495.         glueName: glueName, 
  496.             (k last = ':' ifTrue: [k copyWithoutLast, '_'] False: k) 
  497.           capitalize.
  498.         ].
  499.     glueName: glueName, '_glue').
  500.  
  501.   
  502.   _ buildWrapper = (
  503.         buildWrapperToDefaultFailBlock.
  504.     buildWrapperToCallC).
  505.  
  506.   _ buildWrapperToDefaultFailBlock = (
  507.     wrapperNoFailDcl: wrapperNoFailDcl copy keywords: parser keywords 
  508.                                                 Cvts: argCvts.
  509.         wrapperNoFailDcl privacy: parser privacy.
  510.     
  511.     wrapperFailSend: wrapperNoFailDcl copy.
  512.     wrapperFailSend  addLastKeyword: 'IfFail'
  513.                             Arg: '[|:e| ^error: \'',
  514.                         wrapperNoFailDcl selector,
  515.                         ' failed: \', e]'.
  516.  
  517.         wrapper: '  ', (wrapperNoFailDcl dcl: 4 WithPrivacy: true), ' = (', 
  518.                    (wrapperFailSend send: 6), ').\n\n'.
  519.         self).
  520.     
  521.   _ buildWrapperToCallC = (
  522.     wrapperFailDcl: wrapperNoFailDcl copy addLastKeyword: 'IfFail' 
  523.                              Arg: 'failBlock'.
  524.  
  525.         wrapper: wrapper, '  ', (wrapperFailDcl dcl: 4 WithPrivacy: true),
  526.          '= ('.
  527.  
  528.     glueSend: wrapperNoFailDcl copy.
  529.     argCvts first isVoid ifTrue: [
  530.         glueSend removeFirst.  
  531.         argCvts  removeFirst.
  532.         ].
  533.         resultCvt isProxy  ifTrue: [
  534.         glueSend addLastKeyword: 'ResultProxy'
  535.                         Arg: resultCvt resultArg.
  536.         ].
  537.     glueSend addSelectorPrefix: gluePrefix.
  538.         primName: glueSend selector.
  539.         glueSend addSelectorPrefix: '_'.
  540.  
  541.     fixupGlueSendForDynamicLinking.
  542.  
  543.     glueSend addLastKeyword: 'IfFail' Arg: wrapperFailDcl args last.
  544.     glueSend hasCoercions ifTrue: [
  545.             glueSendWiCvts: glueSend copy applyCvts.
  546.         glueSend replaceLastArgWith:
  547.           '\n      [|:e| (\'badTypeError\'   isPrefixOf: e)',
  548.                   '\n        ||  [\'deadProxyError\' isPrefixOf: e]',
  549.                   '\n           ifFalse: [^failBlock value: e] ',
  550.               '\n              True: [', 
  551.                             (glueSendWiCvts send: 18), 
  552.           '\n           ]]'.
  553.         ].
  554.  
  555.         makeSlotForForeignFct. "uses glueSend"
  556.  
  557.         wrapper: wrapper, (glueSend send: 6).
  558.         resultCvt isVoid ifTrue: [wrapper: wrapper, '.\n    self'].
  559.     wrapper: wrapper, ').\n\n\n'.
  560.         self).
  561.  
  562.   _ primOrGlueCanFail = (
  563.         parser cannotFail not || [resultCvt resCanFail  ||  [
  564.         resultCvt isProxy || [
  565.             argCvts findFirst: [|:cvt| cvt argCanFail]
  566.                     IfPresent: true 
  567.                      IfAbsent: false]]]).
  568.  
  569.   _ glueCount = ('_', argCvts size printString).
  570.  
  571.   _ glueArgCvts: start = ( | v. r <- '' |
  572.         v: argCvts asVector.
  573.         start upTo: v size Do: [|:i. a|
  574.             a: v at: i.
  575.             r: r, ', ', a glueify.
  576.         ].
  577.         r).
  578.  
  579. | )
  580.  
  581.  
  582. traits primitiveMaker staticLinking generator _Define: ( |
  583.   _ parent* = traits primitiveMaker abstractLinking generator.
  584.  
  585.   _ makeSlotForForeignFct = (self).
  586.  
  587.   _ fixupGlueSendForDynamicLinking = (self).
  588.  
  589.   ^ entry = ( 
  590.         '\"', primName, '\", \\\n',
  591.         'fntype(&', glueName, '), \\\n',
  592.         'ExternalPrimitive, \\\n',
  593.         resultCvt primTableRetType, ', \\\n',
  594.  
  595.         primOrGlueCanFail  printString, ', /* can fail               */ \\\n',
  596.         parser canAWS      printString, ', /* can scavenge           */ \\\n',
  597.         false              printString, ', /* can be constant folded */ \\\n',
  598.         true               printString, ', /* cannot be moved or cut */ \\\n',
  599.         parser canAWS      printString, ', /* can walk stack         */ \\\n',
  600.         parser canAWS      printString, ', /* can abort process      */ \\\n',
  601.         ' \\\n').
  602. | )
  603.  
  604. traits primitiveMaker dynamicLinking generator _Define: ( |
  605.   _ parent* = traits primitiveMaker abstractLinking generator.
  606.  
  607.   _ fct = 'myFctObj'.
  608.  
  609.   _ makeSlotForForeignFct = ( | dummyFF. dummySel. |
  610.        dummySel: glueSend copy.
  611.        dummySel makeArgs.
  612.        dummySel args removeLast.
  613.        dummySel args addLast: 'fb'.
  614.        dummyFF: '[ ( | copyName: n = (self). ', (dummySel send: 13),
  615.             '= (fb value: \'could not link\'). | ) ]'.
  616.        wrapper: wrapper, 
  617.         '\n    | ', fct, ' =',
  618.         ((primitiveMaker msg copy 
  619.           receiver: 'foreignFct'
  620.                  K: 'copyName:'  A: '\'', glueName, '\''
  621.              K: 'Path:'      A: reader glueLibraryName
  622.              K: 'IfFail:'     A: dummyFF) send: 6),
  623.         '\n    |\n'.
  624.        self).
  625.  
  626.   _ fixupGlueSendForDynamicLinking = (
  627.     glueSend addFirstReceiver: fct  Keyword: 'value'.
  628.         glueSend valueWithify.
  629.     self).
  630.  
  631.   ^ entry = ''.
  632. | )
  633.  
  634. primitiveMaker generator _Define: ( |
  635.   _ typeParent*       <- ().
  636.   _ generatorParent** <- ().
  637.   _ parent***          =     traits primitiveMaker abstractLinking generator.
  638.  
  639.     parser             <- primitiveMaker parser.
  640.     reader           <- primitiveMaker reader.
  641.  
  642.     glueName         <- ''.
  643.     primName         <- ''.
  644.  
  645.     wrapperNoFailDcl   <- primitiveMaker msg.
  646.     wrapperFailSend    <- primitiveMaker msg.
  647.     wrapperFailDcl     <- primitiveMaker msg.
  648.  
  649.     glueSend           <- primitiveMaker msg.
  650.     glueSendWiCvts     <- primitiveMaker msg.
  651.  
  652.     wrapper           <- ''.
  653. | )
  654.  
  655.  
  656. "======================================================================"
  657.  
  658. traits primitiveMaker msg _Define: ( |
  659.   _ parent* = traits clonable.
  660.  
  661.   _ lotsOargs = ( |
  662.       _ parent* = traits primitiveMaker msg.
  663.  
  664.       ^ addLastKeyword: k Arg: a = (
  665.         args     addLast: a.
  666.         keywords addLast: k, ':'.
  667.         cvts     addLast: primitiveMaker cvts none.
  668.         self).
  669.  
  670.       ^ addFirstReceiver: rcv Keyword: k = (
  671.         args     addFirst: rcv.
  672.         keywords addFirst: k, ':'.
  673.         cvts     addFirst: primitiveMaker cvts none.
  674.         self).
  675.  
  676.       ^ removeFirst = (
  677.         args removeFirst.
  678.         cvts removeFirst.
  679.         keywords addFirst:
  680.             args size = 1  
  681.           ifTrue: [ keywords removeFirst copyWithoutLast]
  682.            False: [ keywords removeFirst copyWithoutLast, 
  683.                 keywords removeFirst].
  684.         setMode).
  685.  
  686.       ^ valueWithify = (
  687.       keywords removeFirst.
  688.           keywords: keywords copyMappedBy: ['With:'].
  689.       keywords addFirst: 'value:'.
  690.       self).
  691.  
  692.       ^ dcl: indent WithPrivacy: pri = (
  693.     | a. in <- ''. r <- ''. col <- 0. toks. |
  694.           in: in copySize: indent.
  695.       a: args copy.
  696.       a removeFirst.
  697.       toks: list copyRemoveAll.
  698.       keywords with: a Do: [|:k. :a|  
  699.           toks addLast: k.
  700.           toks addLast: a.
  701.           ].
  702.       toks do: [|:t|
  703.               (t size succ + col)  >  width ifTrue: [
  704.           r: r, '\n', in.
  705.               col: in size.
  706.               ].
  707.           r: r, t, ' '.
  708.           col: col + t size succ.
  709.           ].
  710.       pri ifTrue: [ r: privacy, ' ', r ].
  711.       r ).
  712.  
  713.        _ width = 60.
  714.     | ).
  715.  
  716.   _ unary = ( |
  717.       _ parent* = traits primitiveMaker msg.
  718.  
  719.       ^ addLastKeyword: k Arg: a = (
  720.         args     addLast: a.
  721.         cvts     addLast: primitiveMaker cvts none.
  722.         keywords addFirst: keywords removeFirst, k, ':'.
  723.         setMode).
  724.  
  725.        ^ addFirstReceiver: rcv Keyword: k = (
  726.         args     addFirst: rcv.
  727.         cvts     addFirst: primitiveMaker cvts none.
  728.         keywords removeFirst.
  729.         keywords addFirst: k, ':'.
  730.         setMode).
  731.  
  732.       ^ removeFirst = (
  733.         args removeFirst.  args addFirst: ignored.
  734.         cvts removeFirst.  cvts addFirst: primitiveMaker cvts none.
  735.         setMode).
  736.  
  737.       ^ valueWithify = (
  738.       keywords removeFirst.
  739.       keywords addFirst: 'value'.
  740.       self).
  741.  
  742.       ^ dcl: indent WithPrivacy: pri = (
  743.       pri ifTrue: [ privacy, ' ', keywords first ]
  744.                False: [ keywords first ] ).
  745.     | ).
  746. | )
  747.  
  748. traits primitiveMaker msg _AddSlots: ( |
  749.  
  750.   _ nullary = ( |
  751.       _ parent* = traits primitiveMaker msg unary.
  752.  
  753.       ^ addLastKeyword: k Arg: a = (
  754.             k = 'IfFail'  ifTrue: [^resend.addLastKeyword: k Arg: a].
  755.         args removeFirst. args addLast: a.
  756.         cvts removeFirst. cvts addLast: primitiveMaker cvts none.
  757.         keywords addFirst: keywords removeFirst, k.
  758.         setMode).
  759.  
  760.        ^ addFirstReceiver: rcv Keyword: k = (
  761.         args     removeFirst.
  762.         cvts     removeFirst.
  763.         keywords removeFirst.
  764.         args     addFirst: rcv.
  765.         cvts     addFirst: primitiveMaker cvts none.
  766.         keywords addFirst: k.
  767.         setMode).
  768.  
  769.       ^ removeFirst = (self).
  770.     | ).
  771.  
  772.   _ setMode = (
  773.         mode:  args size > 1         ifTrue: [lotsOargs] False: [
  774.                args first = ignored  ifTrue: [nullary]     False: [unary]]).
  775.  
  776.   ^ copy = (((
  777.         resend.copy keywords:  keywords copy)
  778.             cvts:      cvts     copy)
  779.                     args:      args    copy).
  780.  
  781.   ^ receiver: r K: k1 A: a1 K: k2 A: a2 K: k3 A: a3 = (
  782.         args removeAll.
  783.     args addLast: r.
  784.     args addLast: a1.
  785.     args addLast: a2.
  786.     args addLast: a3.
  787.  
  788.         keywords removeAll.
  789.     keywords addLast: k1.
  790.     keywords addLast: k2.
  791.     keywords addLast: k3.
  792.  
  793.     cvts removeAll.
  794.     args size do: [cvts addLast: primitiveMaker cvts none].
  795.     setMode).
  796.  
  797.  
  798.   ^ makeArgs = (
  799.         args removeAll.
  800.     cvts size pred do: [|:i| args addLast: 't', i printString].
  801.     args addFirst: 'self'.
  802.     setMode.
  803.     self).
  804.  
  805.   ^ keywords: ks Cvts: cs = (
  806.         keywords: ks copy.
  807.     cvts:     cs copy.
  808.     makeArgs).
  809.  
  810.   _ ignored = '"ignored"'.
  811.  
  812.     "indent is indent of rest of line"
  813.   ^ send: indent = ( | rcvr <- '' |
  814.           args first = 'self' ifFalse: [ rcvr: args first ].
  815.           '\n', ('' copySize: (indent - 2) max: 0), rcvr, ' ',
  816.       (dcl: indent WithPrivacy: false)).
  817.  
  818.   ^ addSelectorPrefix: p = (
  819.           (p isPrefixOf: keywords first) ifTrue: [^self].
  820.           keywords addFirst: p, keywords removeFirst.
  821.       self).
  822.  
  823.   ^ selector = ( | r <- '' |
  824.           keywords do: [|:k| r: r, k].
  825.       r).
  826.  
  827.   ^ hasCoercions = (
  828.           cvts findFirst: [|:a| (a selfConversion: 'fisk') != 'fisk']
  829.            IfPresent: true
  830.             IfAbsent:  false).
  831.  
  832.   ^ applyCvts = ( | a. c |
  833.           a: args.
  834.       c: cvts.
  835.       args: a copyRemoveAll.
  836.       cvts: c copyRemoveAll.
  837.           a with: c Do: [|:a. :c|
  838.           args addLast: c selfConversion: a.
  839.           cvts addLast: primitiveMaker cvts none.
  840.       ].
  841.       self).
  842.  
  843.   ^ replaceLastArgWith: a = (
  844.         args removeLast. 
  845.         args addLast: a.  
  846.         self).
  847. | )
  848.  
  849.  
  850. primitiveMaker msg _Define: ( |
  851.   _ mode*    <- traits primitiveMaker msg unary.
  852.  
  853.  ^  privacy   <- ''.
  854.  ^_ keywords  <- list copy addLast: 'not'.
  855.  ^_ args      <- list copy addLast: 'snort'.
  856.  ^_ cvts      <- list copy "addLast: primitiveMaker cvts none".
  857. | )
  858.  
  859.  
  860. traits primitiveMaker typeTraits _Define: ( |
  861.  
  862.   ^ get = ( |
  863.       _ className = ''.
  864.     ^ glue = (
  865.             ' C_get_var( ', resultCvt glueify, ', ',
  866.                          cName, ', ', glueName, ') \\\n' ).
  867.     | ).
  868.   ^ getMember = ( |
  869.     ^ glue = (
  870.             ' C_get_comp( ', resultCvt glueify, ', ', 
  871.                       argCvts first glueify,
  872.               ', ', '.', cName, ', ', glueName, ') \\\n' ).
  873.   | ).
  874.   ^ set  = ( |
  875.       _ className = ''.
  876.  
  877.     ^ glue = (
  878.             ' C_set_var( ',  cName, ', ', argCvts first glueify, ', ',
  879.                         glueName, ') \\\n' ).
  880.   | ).
  881.   ^ setMember  = ( |
  882.     ^ glue = (
  883.             ' C_set_comp( ',  argCvts first glueify, 
  884.                           ', ', '.', cName, ', ',
  885.                       argCvts last glueify, ', ',  
  886.               glueName, ') \\\n' ).
  887.   | ).
  888.   ^ call = ( |
  889.       _ className = ''.
  890.     ^ glue = (
  891.         ' C_func', glueCount,
  892.         '( ', resultCvt glueify, ', ', cName, ', ',
  893.             glueName, ', ',
  894.             (parser passFailHandle ifTrue: 'fail' False: ''),
  895.             (glueArgCvts: 0), ') \\\n').
  896.   | ).
  897.   ^ callMember = ( |
  898.     ^ glue = (
  899.         ' CC_mber', glueCount,
  900.         '( ', resultCvt glueify, ', ', 
  901.             argCvts first glueify, ', ', 
  902.             cName, ', ',
  903.             glueName, ', ',
  904.             (parser passFailHandle ifTrue: 'fail' False: ''),
  905.             (glueArgCvts: 1), ') \\\n').
  906.   | ).
  907.   ^ new = ( |
  908.       _ className = (resultCvt className).
  909.  
  910.     ^ glue = (
  911.         ' CC_new', glueCount, '( ', resultCvt glueify, ', ', 
  912.             className, ', ',
  913.             glueName,
  914.             (glueArgCvts: 0), ') \\\n').
  915.   | ).
  916.   ^ delete = ( |
  917.     ^ glue = (
  918.         ' CC_delete( ', argCvts first glueify, ', ',  glueName, ') \\\n').
  919.   | ).
  920.  
  921.   ^ undefinedSelector: sel Type: t Delegatee: d MethodHolder: mh
  922.             Arguments: a = (
  923.        sel error: 'is a bad template type: ', sel).
  924.  
  925.   ^ performTypeErrorSelector: sel Type: t Delegatee: d MethodHolder: mh
  926.             Arguments: a = (
  927.        sel error: 'is a bad template type: ', sel).
  928. | )
  929.       
  930. traits primitiveMaker cvts _Define: ( |
  931.     general = ( |
  932.      ^  massageResult: r = (r).
  933.  
  934.      ^  isVoid = false.
  935.      ^  glueify = (main, ',', glueifiedAux).
  936.      ^  primTableRetType = (ptBaseType, 'PrimType').
  937.      _  ptBaseType = 'Unknown'.
  938.      ^  argCanFail = true.
  939.      ^  resCanFail = true.
  940.      ^  selfConversion: a = (a).
  941.      ^  parseArgFrom: tokList = (parseFrom: tokList).
  942.      ^  parseResFrom: tokList = (parseFrom: tokList).
  943.      ^  className = (
  944.          error: 'cannot deduce class name from ', main, ' conversion').
  945.       ^ isProxy = false.
  946.     | ).
  947. | )
  948.  
  949.  
  950. traits primitiveMaker cvts _AddSlots: ( |
  951.     noAux = ( | 
  952.      _  cloning* = traits oddball.
  953.      _  p2* = traits primitiveMaker cvts general.
  954.      ^  parseFrom: tokList = (self).
  955.      _  glueifiedAux = ''.
  956.     | ).
  957.  
  958.     aux   = ( |
  959.      _  cloning* = traits clonable.
  960.      _  p2* = traits primitiveMaker cvts general.
  961.      ^  parseFrom: tokList = (copy setFrom: tokList).
  962.     | ).
  963. | )
  964.  
  965.  
  966. traits primitiveMaker cvts _AddSlots: ( |
  967.     ints = ( |
  968.       _ parent* = traits primitiveMaker cvts noAux.
  969.       _ ptBaseType = 'Integer'.
  970.       ^ selfConversion: a = (a, ' asSmallInteger').
  971.     | ).
  972.  
  973.     floats = ( |
  974.       _ parent* = traits primitiveMaker cvts noAux.
  975.       _ ptBaseType = 'Float'.
  976.       ^ selfConversion: a = (a, ' asFloat').
  977.     | ).
  978.  
  979.     strings = ( |
  980.       _ parent* = traits primitiveMaker cvts noAux.
  981.       ^  selfConversion: a = (a, ' asByteVector').
  982.     | ).
  983.  
  984.     byteVectors = ( |
  985.       _ parent* = traits primitiveMaker cvts aux.
  986.       _ ptBaseType = 'ByteVector'.
  987.       _ setFrom: tokList = (
  988.             tokList isEmpty ifTrue: [^error: 'byteVectors need ptr type'].
  989.             ptrType: tokList removeFirst.
  990.             self).
  991.       _ glueifiedAux = (ptrType).
  992.       ^ selfConversion: a = (a, ' asByteVector').
  993.     | ).
  994.  
  995.     proxies = ( |
  996.       _ parent* = traits primitiveMaker cvts aux.
  997.       _ setFrom: tokList = (
  998.             tokList size < 2
  999.                 ifTrue: [^error: 'proxies need ptr type and type seal'].
  1000.             ptrType:  tokList removeFirst.
  1001.             typeSeal: tokList removeFirst.
  1002.             self).
  1003.       ^ parseArgFrom: tokList = (copy setFrom: tokList).
  1004.       ^ parseResFrom: tokList = (
  1005.             (parseArgFrom: tokList)  setResultProxyFrom: tokList).
  1006.       _ setResultProxyFrom: tokList = (
  1007.             tokList isEmpty ifTrue: [
  1008.                 ^error: 'returned proxy need result proxy'
  1009.             ].
  1010.             resultProxy: tokList removeFirst.
  1011.             self).
  1012.       _ glueifiedAux = ('(', ptrType, ',', typeSeal, ')').
  1013.       ^ isProxy = true.
  1014.       ^ resultArg = (resultProxy).
  1015.       ^ selfConversion: a = ( | rcvr <- '' |
  1016.             a = 'self' ifFalse: [ rcvr: a ].
  1017.             '(', rcvr, ' reviveIfFail: [|:e| ^ failBlock value: e])'   ).
  1018.     | ).
  1019. | )
  1020.  
  1021.  
  1022. traits primitiveMaker cvts _AddSlots: ( |
  1023.     fctProxies = ( |
  1024.       _ parent* = traits primitiveMaker cvts proxies.
  1025.       _ setFrom: tokList = (
  1026.             resend.setFrom: tokList.
  1027.             tokList isEmpty ifTrue: [^error: 'fctProxies need argCount'].
  1028.             argCount:  tokList removeFirst.
  1029.             self).
  1030.       _ glueifiedAux = ('(', ptrType, ',', typeSeal, ',', argCount, ')').
  1031.     | ).
  1032. | )
  1033.  
  1034.  
  1035. primitiveMaker cvts _Define: ( |
  1036.  
  1037.   ^ none = ( |
  1038.         p* = traits oddball.
  1039.         selfConversion: a = (a).
  1040.     isVoid = false.
  1041.   | ).
  1042.  
  1043.   ^ oop                = ( |
  1044.       _ auxp* = traits primitiveMaker cvts aux. 
  1045.       _ main = 'oop'.
  1046.         oopSubtype <- ''.
  1047.       _ setFrom: tokList = (
  1048.             tokList isEmpty ifTrue: [^error: 'oop needs oopSubtype'].
  1049.             oopSubtype:  tokList removeFirst.
  1050.             self).
  1051.       ^ parseResFrom: tokList = (self).
  1052.       _ glueifiedAux = (oopSubtype).
  1053.     | ).
  1054.   ^ any_oop            = ( |
  1055.       _ auxp* = traits primitiveMaker cvts noAux. 
  1056.       _ main = 'any_oop'.
  1057.       ^ argCanFail = false.
  1058.     | ).
  1059.   ^ any                = ( |
  1060.       _ auxp* = traits primitiveMaker cvts aux.
  1061.       _ main = 'any'.
  1062.       _ setFrom: tokList = (
  1063.           tokList isEmpty ifTrue: [^error: 'any needs C type'].
  1064.       cType: tokList removeFirst.
  1065.       self).
  1066.       _ glueifiedAux = (cType).
  1067.       _ cType <- ''
  1068.     | ).
  1069.   ^ void               = ( |
  1070.       _ auxp* = traits primitiveMaker cvts noAux. 
  1071.       ^ massageResult: r = (r, '.\n    self'). 
  1072.       ^ isVoid = true.
  1073.  
  1074.       _ main = 'void'.
  1075.       _ ptBaseType = 'Unknown'.
  1076.       ^ resCanFail = false.
  1077.     | ).
  1078.   ^ bool               = ( |
  1079.       _ auxp* = traits primitiveMaker cvts noAux. 
  1080.       _ ptBaseType = 'Boolean'.
  1081.       _ main = 'bool'.
  1082.       ^ resCanFail = false.
  1083.     | ).
  1084.  
  1085.   ^ float              = ( |
  1086.       _ auxp* = traits primitiveMaker cvts floats. 
  1087.       _ main = 'float'.
  1088.     | ).
  1089.   ^ double             = ( |
  1090.       _ auxp* = traits primitiveMaker cvts floats. 
  1091.       _ main = 'double'
  1092.     | ).
  1093.   ^ long_double        = ( |
  1094.       _ auxp* = traits primitiveMaker cvts floats. 
  1095.       _ main = 'long_double'.
  1096.     | ).
  1097.  
  1098.   ^ char               = ( |
  1099.       _ rtp*  = traits primitiveMaker cvts ints.
  1100.       _ main = 'char'.
  1101.       ^ resCanFail = false.
  1102.     | ).
  1103.   ^ short       = ( |
  1104.       _ rtp*  = traits primitiveMaker cvts ints.
  1105.       _ main = 'short'.
  1106.       ^ resCanFail = false.
  1107.     | ).
  1108.   ^ int_or_errno       = ( |
  1109.       _ rtp*  = traits primitiveMaker cvts aux.
  1110.       _ ptBaseType = 'Integer'.
  1111.       ^ selfConversion: a = (a, ' asSmallInteger').
  1112.       _ main = 'int_or_errno'.
  1113.       _ glueifiedAux = (errorValue).
  1114.       _ setFrom: tokList = (
  1115.           tokList isEmpty ifTrue: [^error: main, ' needs errorValue'].
  1116.       errorValue: tokList removeFirst.
  1117.       self).
  1118.       _ errorValue.
  1119.     | ).
  1120.   ^ int                = ( |
  1121.       _ rtp*  = traits primitiveMaker cvts ints.
  1122.       _ main = 'int'.
  1123.     | ).
  1124.   ^ smi                = ( |
  1125.       _ rtp*  = traits primitiveMaker cvts ints.
  1126.       _ main = 'smi'.
  1127.     | ).
  1128.   ^ long               = ( |
  1129.       _ rtp*  = traits primitiveMaker cvts ints.
  1130.       _ main = 'long'.
  1131.     | ).
  1132.   ^ signed_char        = ( |
  1133.       _ rtp*  = traits primitiveMaker cvts ints.
  1134.       _ main = 'signed_char'.
  1135.       ^ resCanFail = false.
  1136.     | ).
  1137.   ^ signed_short       = ( |
  1138.       _ rtp*  = traits primitiveMaker cvts ints.
  1139.       _ main = 'signed_short'.
  1140.       ^ resCanFail = false.
  1141.     | ).
  1142.   ^ signed_int         = ( |
  1143.       _ rtp*  = traits primitiveMaker cvts ints.
  1144.       _ main = 'signed_int'.
  1145.     | ).
  1146.   ^ signed_long        = ( |
  1147.       _ rtp*  = traits primitiveMaker cvts ints.
  1148.       _ main = 'signed_long'.
  1149.     | ).
  1150.   ^ unsigned_char      = ( |
  1151.       _ rtp*  = traits primitiveMaker cvts ints.
  1152.       _ main = 'unsigned_char'.
  1153.       ^ resCanFail = false.
  1154.     | ).
  1155.   ^ unsigned_short     = ( |
  1156.       _ rtp*  = traits primitiveMaker cvts ints.
  1157.       _ main = 'unsigned_short'.
  1158.       ^ resCanFail = false.
  1159.     | ).
  1160.   ^ unsigned_int       = ( |
  1161.       _ rtp*  = traits primitiveMaker cvts ints.
  1162.       _ main = 'unsigned_int'.
  1163.     | ).
  1164.   ^ unsigned_long      = ( |
  1165.       _ rtp*  = traits primitiveMaker cvts ints.
  1166.       _ main = 'unsigned_long'.
  1167.     | ).
  1168.  
  1169.   ^ string             = ( |
  1170.       _ auxp* = traits primitiveMaker cvts strings. 
  1171.       _ main = 'string'.
  1172.     | ).
  1173.   ^ string_len         = ( |
  1174.       _ auxp* = traits primitiveMaker cvts strings. 
  1175.       _ main = 'string_len'.
  1176.     | ).
  1177.   ^ string_null        = ( |
  1178.       _ auxp* = traits primitiveMaker cvts strings. 
  1179.       _ main = 'string_null'.
  1180.     | ).
  1181.   ^ string_len_null    = ( |
  1182.       _ auxp* = traits primitiveMaker cvts strings. 
  1183.       _ main = 'string_len_null'.
  1184.     | ).
  1185.   ^ bv                 = ( |
  1186.       _ auxp* = traits primitiveMaker cvts byteVectors. 
  1187.       _ main = 'bv'.
  1188.       _ ptrType.
  1189.     | ).
  1190.   ^ bv_len             = ( |
  1191.       _ auxp* = traits primitiveMaker cvts byteVectors. 
  1192.       _ main = 'bv_len'.
  1193.       _ ptrType.
  1194.     | ).
  1195.   ^ bv_null            = ( |
  1196.       _ auxp* = traits primitiveMaker cvts byteVectors. 
  1197.       _ main = 'bv_null'.
  1198.       _ ptrType.
  1199.     | ).
  1200.   ^ bv_len_null        = ( |
  1201.       _ auxp* = traits primitiveMaker cvts byteVectors. 
  1202.       _ main = 'bv_len_null'.
  1203.       _ ptrType.
  1204.     | ).
  1205.   ^ cbv                = ( |
  1206.       _ auxp* = traits primitiveMaker cvts byteVectors. 
  1207.       _ main = 'cbv'.
  1208.       _ ptrType.
  1209.     | ).
  1210.   ^ cbv_len            = ( |
  1211.       _ auxp* = traits primitiveMaker cvts byteVectors. 
  1212.       _ main = 'cbv_len'.
  1213.       _ ptrType.
  1214.     | ).
  1215.   ^ cbv_null           = ( |
  1216.       _ auxp* = traits primitiveMaker cvts byteVectors. 
  1217.       _ main = 'cbv_null'.
  1218.       _ ptrType.
  1219.     | ).
  1220.   ^ cbv_len_null       = ( |
  1221.       _ auxp* = traits primitiveMaker cvts byteVectors. 
  1222.       _ main = 'cbv_len_null'.
  1223.       _ ptrType.
  1224.     | ).
  1225.   ^ autoProxy          = ( |
  1226.       _ auxp* = traits primitiveMaker cvts proxies. 
  1227.       _ main = 'proxy'.
  1228.       ^ className.  _ resultProxy.
  1229.       _ ptrType = (className, '*').
  1230.       _ typeSeal = (className, '_seal').
  1231.       ^ parseArgFrom: tokList = (self).
  1232.       ^ parseResFrom: tokList = (setResultProxyFrom: tokList).
  1233.     | ).
  1234.   ^ proxy              = ( |
  1235.       _ auxp* = traits primitiveMaker cvts proxies. 
  1236.       _ main = 'proxy'.
  1237.       _ ptrType.  _ typeSeal.  _ resultProxy.
  1238.     | ).
  1239.   ^ proxy_null         = ( |
  1240.       _ auxp* = traits primitiveMaker cvts proxies. 
  1241.       _ main = 'proxy_null'.
  1242.       _ ptrType.  _ typeSeal.  _ resultProxy.
  1243.     | ).
  1244.   ^ proxy_or_errno     = ( |
  1245.       _ auxp* = traits primitiveMaker cvts proxies. 
  1246.       _ main = 'proxy_or_errno'.
  1247.       _ setFrom: tokList = (
  1248.           resend.setFrom: tokList.
  1249.       tokList isEmpty ifTrue: [^error: main, ' needs errorValue'].
  1250.       errorValue: tokList removeFirst.
  1251.       self).
  1252.       _ glueifiedAux = ( '(', ptrType, ',', typeSeal, ',', errorValue, ')').
  1253.       _ ptrType.  _ typeSeal.  _ resultProxy.  _ errorValue.
  1254.     | ).
  1255.   ^ fct_proxy          = ( |
  1256.       _ auxp* = traits primitiveMaker cvts fctProxies. 
  1257.       _ main = 'fct_proxy'.
  1258.       _ ptrType.  _ typeSeal.  _ argCount.  _ resultProxy.
  1259.     | ).
  1260.   ^ fct_proxy_null     = ( |
  1261.       _ auxp* = traits primitiveMaker cvts fctProxies. 
  1262.       _ main = 'fct_proxy_null'.
  1263.       _ ptrType.  _ typeSeal.  _ argCount.  _ resultProxy.
  1264.     | ).
  1265.   ^ fct_proxy_or_errno = ( |
  1266.       _ auxp* = traits primitiveMaker cvts fctProxies. 
  1267.       _ main = 'fct_proxy_or_errno'.
  1268.       _ ptrType.  _ typeSeal.  _ argCount.  _ resultProxy.
  1269.     | ).
  1270.  
  1271.   ^ proxyForClass: name = (autoProxy copy className: name).
  1272.  
  1273.   ^ undefinedSelector: sel Type: t Delegatee: d MethodHolder: mh
  1274.             Arguments: a = (
  1275.             proxyForClass: sel).
  1276.  
  1277.   ^ performTypeErrorSelector:sel Type:t Delegatee:d MethodHolder: mh
  1278.                    Arguments: a = (
  1279.             proxyForClass: sel).
  1280. | )           
  1281.  
  1282.  
  1283. "primitiveMaker reader test"
  1284.